import akka.actor.{Actor, ActorRef, ActorSystem, Props}

import scala.io.StdIn
import scala.util.Random


//机
//class AActor(actorRef: ActorRef) extends Actor {
//  val bActorRef: ActorRef = actorRef
////  val consoleLine: String = StdIn.readLine()
//  override def receive: Receive = {
//    case "start" => {
//      println("请选择对战角色（1、刘备  2、关羽  3、张飞）：")
//      Thread.sleep(1000)
//      bActorRef ! "请输入对战角色" //给 BActor 发出消息
//    }
//    case "role1" => {
//      println("你选择了与刘备对战\n 要开始了吗？y/n")
//      Thread.sleep(1000)
//      bActorRef  ! "刘备问要开始了吗"
//    }
//    case "role2" => {
//      println("你选择了与关羽对战\n 要开始了吗？y/n ")
//      Thread.sleep(1000)
//      bActorRef  ! "关羽问要开始了吗"
//    }
//    case "role3" => {println("你选择了与张飞对战\n 要开始了吗？y/n ")
//      Thread.sleep(1000)
//      bActorRef  ! "张飞问要开始了吗" //!发送消息
//    }
//
//    case "l_start_y" => {
//      println("请出拳！1、剪刀 2、石头 3、布")
//      Thread.sleep(1000)
//      bActorRef  ! "刘备说请出拳" //!发送消息
//    }
//
//    case "g_start_y" => {
//      println("请出拳！1、剪刀 2、石头 3、布")
//      Thread.sleep(1000)
//      bActorRef  ! "关羽说请出拳" //!发送消息
//    }
//
//    case "z_start_y" => {
//      println("请出拳！1、剪刀 2、石头 3、布")
//      Thread.sleep(1000)
//      bActorRef  ! "张飞说请出拳" //!发送消息
//    }
//    case "l_throw_1" => {
//      println(s"你出拳剪刀")
//      println(s"刘备出拳")
//      println(s"刘备出拳：剪刀")
//      println(s"结果：和局！下次继续努力！")
//      println(s"是否开始下一轮（y/n）")
//      Thread.sleep(1000)
//      bActorRef  ! "是否开始下一轮" //!发送消息
//    }
//    case "g_throw_1" => {
//      println(s"你出拳剪刀")
//      println(s"关羽出拳")
//      println(s"关羽出拳：剪刀")
//      println(s"结果：和局！下次继续努力！")
//      println(s"是否开始下一轮（y/n）")
//      Thread.sleep(1000)
//      bActorRef  ! "是否开始下一轮" //!发送消息
//    }
//
//    case "z_throw_1" => {
//      println(s"你出拳剪刀")
//      println(s"张飞出拳")
//      println(s"张飞出拳：剪刀")
//      println(s"结果：和局！下次继续努力！")
//      println(s"是否开始下一轮（y/n）")
//      Thread.sleep(1000)
//      bActorRef  ! "是否开始下一轮" //!发送消息
//    }
//
//    case "next_n" => {
//      //关闭自己
//      context.stop(self)
//      //关闭ActorSystem
//      context.system.terminate()
//      println(s"battle结束")
//    }
//
//
//  }
//}
//
////人
//class BActor extends Actor{
////  val consoleLine: String = StdIn.readLine()
//  override def receive:Receive = {
//    case "请输入对战角色" => {
//      val consoleLine: String = StdIn.readLine()
//      //通过 sender() 可以获取到发现消息的 actor 的 ref
//      sender()  ! "role" + consoleLine
//    }
//    case "刘备问要开始了吗" =>{
//      val consoleLine: String = StdIn.readLine()
//      sender()  ! "l_start_" + consoleLine
//    }
//    case "关羽问要开始了吗" =>{
//      val consoleLine: String = StdIn.readLine()
//      sender()  ! "g_start_" + consoleLine
//    }
//    case "张飞问要开始了吗" =>{
//      val consoleLine: String = StdIn.readLine()
//      sender()  ! "z_start_" + consoleLine
//    }
//
//
//
////    case "刘备说请出拳" =>{
////      val consoleLine: String = StdIn.readLine()
////      sender()  ! "l_throw_" + consoleLine
////    }
////    case "关羽说请出拳" =>{
////      val consoleLine: String = StdIn.readLine()
////      sender()  ! "g_throw_" + consoleLine
////    }
////    case "张飞说请出拳" =>{
////      val consoleLine: String = StdIn.readLine()
////      sender()  ! "z_throw_" + consoleLine
////    }
//
//    case "是否开始下一轮" =>{
//      val consoleLine: String = StdIn.readLine()
//      if (consoleLine.equals("y")) {
//        sender()  ! "start"
//      }else{
//        sender()  ! "next_" + consoleLine
//      }
//
//
//    }
//
//
//  }
//}

object  BattleActor extends App {
  // 游戏自定义玩家
  val AIplayers = Map("1" -> "刘备", "2" -> "关羽", "3" -> "张飞")
  // 石头剪刀布
  val fists = Map("1" -> "石头", "2" -> "剪刀", "3" -> "布")

  // 玩家
  var playerA: User = null
  // AI
  var playerB: Computer = null
  // 对战次数
  var times = 0

  //玩游戏
  play


  def init: Unit ={
    println("--------欢迎进入游戏世界--------")
    println("****************************")
    println("**********猜拳开始！**********")
    println("****************************\n\n")
    playerA = new User("游客", 0)
    println("请选择对战角色：（1.刘备 2.关羽 3.张飞）")
    val key = StdIn.readLine()
    playerB = new Computer(AIplayers(key), 0)
  }




  def judge(ares: String, bres: String) = {
    val fair = ares == bres
    if (fair) {
      // 平局
      playerA.score += 1
      playerA.fairs += 1
      playerB.score += 1
      playerB.fairs += 1
      println("结果，和局！下次继续努力！")
    } else {
      val win = (ares == "1" && bres == "2") || (ares == "2" && bres =="3") || (ares == "3" && bres == "1")
      if (win) {
        // 玩家赢
        playerA.score += 2
        playerA.wins += 1
        playerB.fails += 1
        println("恭喜！你赢啦！")
      } else {
        // 玩家输
        playerB.score += 2
        playerB.wins += 1
        playerA.fails += 1
        println("抱歉！你输了！")
      }
    }
  }

  /**
   * 显示对战结果
   */
  def showResults() = {
    println(s"${playerB.name}\tVS\t${playerA.name}")
    println(s"对战次数${times}次\n\n")
    println("姓名\t得分\t胜局\t和局\t负局")
    println(s"${playerA.name}\t${playerA.score}\t${playerA.wins}\t${playerA.fairs}\t${playerA.fails}")
    println(s"${playerB.name}\t${playerB.score}\t${playerB.wins}\t${playerB.fairs}\t${playerB.fails}")
  }
  /**
   * 玩游戏
   */
  def play: Unit ={
    init
    println(s"你选择了与${playerB.name}对战\n要开始么？y/n")
    var next = true
    var s = StdIn.readLine()
    do {
      s match {
        case "y" => {
          println("请出拳！1.石头 2.剪刀 3.布")
          var ares = playerA.showFist()
          println(s"${playerB.name}出拳！")
          var bres = playerB.showFist()
          // 判断结果
          judge(ares, bres)
          times += 1
          println("是否开始下一轮？（y/n）")
          s = StdIn.readLine()
        }
        case "n" => {
          // 终止对战并显示结果
          next = false
          println("退出游戏！")
          println("------------------------------")
          showResults()
        }
        case _ => {
          println("是否开始下一轮？（y/n）")
          s = StdIn.readLine()
        }
      }
    } while (next)
  }

  class Computer(var name:String, var score:Int) {
    // 也可以定义两个四元组（玩家,胜,和,负）存储结果
    var wins = 0
    var fails = 0
    var fairs = 0
    def showFist(): String = {
      val bres = Random.nextInt(3)+1
      println(s"${playerB.name}出拳：${fists(bres.toString)}")
      bres.toString
    }
  }

  class User(var name: String, var score: Int) {
    var wins = 0
    var fails = 0
    var fairs = 0
    def showFist(): String = {
      var ares = StdIn.readLine()
      if (!fists.keySet.contains(ares)) {
        println("输入不符合规范，默认出布！")
        ares = "3"
      }
      println(s"你出拳：${fists(ares)}")
      ares
    }
  }

//  //创建 ActorSystem
//  val actorfactory = ActorSystem("actorfactory")
//  //先创建 BActor 引用/代理
//  val bActorRef: ActorRef = actorfactory.actorOf(Props[BActor], "bActor")
//  //创建 AActor 的引用
//  val aActorRef: ActorRef = actorfactory.actorOf(Props(new AActor(bActorRef)), "aActor")
//  //aActor 出招
//  aActorRef ! "start"

}

/*
object BattleActor {

  //通过ActorSystem创建线程池对象myFactory
  private val oneFactory = ActorSystem("oneFactory")
  //通过myFactory.actorOf来创建一个Actor
  private val helloActorRef: ActorRef = oneFactory.actorOf(Props[BattleActor], "BattleActor")

  def main(args: Array[String]): Unit = {

    println("--------------欢迎进入游戏世界----------------")
    println("**********************************************")
    println("****************猜拳开始**********************")
    println("**********************************************")

    var flag = true
    while (flag) {
      print("请选择对战角色（1、刘备  2、关羽  3、张飞）：")
      val consoleLine: String = StdIn.readLine()
      //!发送消息
      helloActorRef ! consoleLine
      if (consoleLine.equals("拜拜")) {
        flag = false
        println("程序即将结束！")
      }
//      if (consoleLine.equals("1")) {
//        flag = false
//        println("程序即将结束！")
//      }

      //让程序休眠100毫秒
      Thread.sleep(100)
    }
  }
}

*/